package main

import (
	"fmt"
	"github.com/labstack/echo/v4"
	"log"
	"net/http"
)

// 根据 Content-Type 请求标头将 json，xml，form 或 query 负载绑定到 Go 结构中。
// 通过状态码将响应渲染为 json 或者 xml 格式。
func main() {

	e := echo.New()
	e.POST("/user/json", jsonBind)
	e.POST("/user/xml", xmlBind)
	e.POST("/user/form", formBind)
	e.GET("/user/query", queryBind)

	e.Start(":80")

}

// jsonBind
//
//	@Description: post请求：传递json格式数据
//
// {
// "name": "lisi",
// "age": 19
// }
//
//	@param c
//	@return error
func jsonBind(c echo.Context) error {
	user := &User{}
	err := c.Bind(user)
	if err != nil {
		return err
	}
	log.Println(&user)
	return c.String(http.StatusOK, "jsonBind:"+user.String())
}

// xmlBind
//
//	@Description:  post请求：传递xml格式数据
//
// <user>
// <name>zhangsan</name>
// <age>20</age>
// </user>
//
//	@param c
//	@return error
func xmlBind(c echo.Context) error {
	user := &User{}
	err := c.Bind(user)
	if err != nil {
		return err
	}
	log.Println(&user)
	return c.String(http.StatusOK, "xmlBind:"+user.String())
}

// formBind
//
//	@Description: post请求：传递form表单数据
//	@param c
//	@return error
func formBind(c echo.Context) error {
	user := &User{}
	err := c.Bind(user)
	if err != nil {
		return err
	}
	log.Println(&user)
	return c.String(http.StatusOK, "formBind:"+user.String())
}

// queryBind
//
//	@Description: Get请求：传递query参数 http://localhost:80/user/query?name=wangwu&age=11
//	@param c
//	@return error
func queryBind(c echo.Context) error {
	user := &User{}
	err := c.Bind(user)
	if err != nil {
		return err
	}
	log.Println(&user)
	return c.String(http.StatusOK, "queryBind:"+user.String())
}

type User struct {
	Name string `json:"name" xml:"name" form:"name" query:"name"`
	Age  int    `json:"age" xml:"age" form:"age" query:"age"`
}

func (u *User) String() string {
	return fmt.Sprintf("name=%v age=%d", u.Name, u.Age)
}
